129bb10ea1516f7b9d29a390a200f5d45cfb3060,src/freenet/store/BerkeleyDBFreenetStore.java,BerkeleyDBFreenetStore,overwriteLRUBlock,#number[]#number[]#Transaction#DatabaseEntry#number[]#,1492

Before Change


		
		fcWriteStore(storeBlock.getOffset(), header, data);
		fcWriteLRU( storeBlock.getOffset(),storeBlock.recentlyUsed);
		if (keysRAF != null)
			fcWriteKey(storeBlock.getOffset(), fullKey);
		synchronized (this) {
			writes++;
		}

After Change


		}
	}
	
	private void overwriteLRUBlock(byte[] header, byte[] data, Transaction t, DatabaseEntry routingkeyDBE, byte[] fullKey) throws DatabaseException, IOException {
		// Overwrite an other block
		Cursor c = accessTimeDB.openCursor(t,null);
		StoreBlock oldStoreBlock;
		try {
			DatabaseEntry keyDBE = new DatabaseEntry();
			DatabaseEntry dataDBE = new DatabaseEntry();
			c.getFirst(keyDBE,dataDBE,LockMode.RMW);
			oldStoreBlock = (StoreBlock) storeBlockTupleBinding.entryToObject(dataDBE);
			c.delete();
		} finally {
			c.close();
		}
		// Deleted, so we can now reuse it.
		// Because we acquired a write lock, nobody else has taken it.
		// FIXME if this fails we can leak the block??
		StoreBlock storeBlock = new StoreBlock(this, oldStoreBlock.getOffset());
		DatabaseEntry blockDBE = new DatabaseEntry();
		storeBlockTupleBinding.objectToEntry(storeBlock, blockDBE);
		keysDB.put(t,routingkeyDBE,blockDBE);
		synchronized(storeRAF) {
			storeRAF.seek(storeBlock.getOffset()*(long)(dataBlockSize+headerBlockSize));
			storeRAF.write(header);
			storeRAF.write(data);
			lruRAF.seek(storeBlock.getOffset() * 8);
			lruRAF.writeLong(storeBlock.recentlyUsed);
			if(keysRAF != null) {
				keysRAF.seek(storeBlock.getOffset() * keyLength);
				keysRAF.write(fullKey);
			}
			writes++;
		}